// 闭包的定义特性
function addCount(){
	var count = 0;
	return function(){
		count += 1;
		console.log(count);
	}
}
var fun1 = addCount();
var fun2 = addCount();
fun1();//1
fun1();//2
fun1();//3
fun2();//1
fun2();//2
// console.log(count); // 错误
// 每次的直接调用都是在开辟一个新的地址,但是把它赋给一个变量的时候，地址就不会再改变了
console.log("---------2---------");
function fn(){
	var a = 3;
	return function(){
		return ++a;
	}
}
console.log(fn()());//4
console.log(fn()());//4
console.log(fn()());//4
var newFn = fn();
console.log(newFn());//4
console.log(newFn());//5
console.log(newFn());//6
console.log("---------闭包----------");
// (function() { 
//     var m = 0; 
//     function getM(){ 
//         return m; 
//     }
//     function seta(val){
//         m = val;
//     }
//     window.g = getM;
//     window.f = seta;
// })();
// f(100);
// console.log(g());//100

// (function(){ /* code */ })()是立即执行函数，当js执行到(function {// code})();时, 由于(function {// code})是表达式, 
// js会去对它求解得到返回值, 由于返回值是一个函数, 故而遇到()时, 便会被执行。然后把getM和seta给到了window
